import datetime
import decimal

def  strftimeTables(object,c,excludeFiledList):
    if c in excludeFiledList:
        return None
    elif type(getattr(object, c)) == datetime.time and getattr(object, c) != None:
        return getattr(object, c).strftime("%H:%M:%S")
    elif type(getattr(object, c)) == datetime.date and getattr(object, c) != None:
        return getattr(object, c).strftime("%Y-%m-%d")
    elif type(getattr(object, c)) == datetime.datetime and getattr(object, c) != None:
        return getattr(object, c).strftime("%Y-%m-%d %H:%M:%S")
    elif type(getattr(object, c)) == decimal.Decimal and getattr(object, c) != None:
        return float(getattr(object, c))
    else:
        return getattr(object, c)

def  strftimeData(object,c,excludeFiledList):
    # name：列的名称。如果未指定，则默认为属性名。
    # type_：列的数据类型。可以是SQLAlchemy内置的数据类型，如Integer、String、DateTime等，也可以是自定义的数据类型。
    # primary_key：布尔值，指定该列是否为主键。默认为False。
    # index：布尔值，指定是否为该列创建索引。默认为False。
    # unique：布尔值，指定该列的值是否唯一。默认为False。
    # nullable：布尔值，指定该列是否可以为空。默认为True。
    # default：指定该列的默认值。可以是一个值或一个可调用对象。
    # server_default：指定该列在数据库中的默认值。可以是一个值或一个可调用对象。
    # onupdate：指定该列在更新时的默认值。可以是一个值或一个可调用对象。
    # autoincrement：布尔值，指定该列是否为自增列。默认为False。
    # comment：指定该列的注释。
    # print(inspect.getmembers(c.name))
    # print('获取字段类型',c.type)
    # print('获取字段主键',c.primary_key)
    # print('获取字段允许为空',c.nullable)
    # print('获取字段默认值',c.default)
    # print('获取字段说明',c.doc)
    # print('获取字段自增',c.autoincrement)
    # print('获取字段唯一',c.unique)
    # print('获取字段外键',c.foreign_key)
    if c.name in excludeFiledList:
        return None
    elif c.type.python_type == datetime.time and getattr(object, c.name)!=None:
        return getattr(object, c.name).strftime("%H:%M:%S")
    elif c.type.python_type == datetime.date and getattr(object, c.name)!=None:
        return getattr(object, c.name).strftime("%Y-%m-%d")
    elif c.type.python_type == datetime.datetime and getattr(object, c.name)!=None:
        return getattr(object, c.name).strftime("%Y-%m-%d %H:%M:%S")
    elif c.type.python_type == decimal.Decimal and getattr(object, c.name)!=None:
        return float(getattr(object, c.name))
    else:
        return getattr(object, c.name)
# 将单个数据转为dict
def model_to_dict(object,excludeFiledList=None):
    """
    将单个数据转为dict
    :param object: orm列表查询的数据源结果
    :param excludeFiledList: 需要排除不显示的字段
    :return:
    """
    if excludeFiledList is None:
        excludeFiledList = []
    if hasattr(object,'__table__')==True:
        # print('进入的是单表查询')
        columns = object.__table__.columns
        return {c.name: strftimeData(object, c, excludeFiledList) for c in columns}
    else:
        # print('进入的是多表查询')
        columns = object._fields
        return {c: strftimeTables(object,c,excludeFiledList) for c in columns}

# 将一组数据转为list
def model_to_list(object,excludeFiledList=None):
    """
    将一组数据转为list
    :param object: orm列表查询的数据源结果
    :param excludeFiledList: 需要排除不显示的字段
    :return:
    """
    return [model_to_dict(c,excludeFiledList) for c in object]